# all the imports
import os
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, \
     render_template, flash

app = Flask(__name__)
app.config.from_object(__name__)


# 基础配置,配置路径,初始账号密码
app.config.update(dict(
    DATABASE=os.path.join(app.root_path, 'flaskr.db'),
    SECRET_KEY='development key',
    USERNAME='admin',
    PASSWORD='admin'
))
app.config.from_envvar('FLASKR_SETTINGS', silent=True)

def connect_db():
    """用于连接数据库,返回一个数据库对象"""
    rv = sqlite3.connect(app.config['DATABASE'])  # app.config['DATABASE'] 是是数据库的路径
    rv.row_factory = sqlite3.Row
    return rv

def get_db():
    """首次调用的时候会为当前环境创建一个数据库连接，后继调用返回已经建立好的连接"""
    if not hasattr(g, 'sqlite_db'):   # 用到了反射
        g.sqlite_db = connect_db()
    return g.sqlite_db

@app.teardown_appcontext
def close_db(error):
    """在请求结束后关闭数据库"""
    if hasattr(g, 'sqlite_db'):   # 用到了反射
        g.sqlite_db.close()

@app.route("/init")
def init_db():
    """初始化数据库"""
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
        print(f.read())
    db.commit()
    return "Init OK!"

# 视图函数

# 404界面
@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404

# 显示条目
@app.route('/')
def show_entries():
    """这个视图显示数据库中存储的所有条目。
    id 值最大的条目（最新的条目）会显示在最上方。"""
    db = get_db()
    cur = db.execute('select title, text from entries order by id desc')
    entries = cur.fetchall()
    return render_template('show_entries.html', entries=entries)

# 添加新条目
@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        # 判断用户是否登录
        abort(401)
    db = get_db()
    db.execute('insert into entries (title, text) values (?, ?)',
                 [request.form['title'], request.form['text']])
    db.commit()
    flash('文章发布成功!')
    return redirect(url_for('show_entries'))

# 登入和登出
@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = '用户名不存在!'
        elif request.form['password'] != app.config['PASSWORD']:
            error = '密码错误'
        else:
            session['logged_in'] = True
            flash('登录成功!')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('注销成功!')
    return redirect(url_for('show_entries'))